package org.seedltd.upms.model.detection.vo;

import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Serializable;

/**
 *
 * 退款返回值
 *
 * @author laizuan
 * @version 1.0
 * @since 2021/8/13 14:23
 */
@Getter
@Setter
public class RefundVO {

    private static final long serialVersionUID = -1L;
    /**
     * <pre>
     * 字段名：微信退款单号
     * 变量名：refund_id
     * 是否必填：是
     * 类型：string[1, 32]
     * 描述：
     *  微信支付退款号。
     *  示例值：50000000382019052709732678859
     * </pre>
     */
    private String refundId;
    /**
     * <pre>
     * 字段名：商户退款单号
     * 变量名：out_refund_no
     * 是否必填：是
     * 类型：string[1, 64]
     * 描述：
     *  商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
     *  示例值：1217752501201407033233368018
     * </pre>
     */
    private String outRefundNo;
    /**
     * <pre>
     * 字段名：微信支付订单号
     * 变量名：transaction_id
     * 是否必填：是
     * 类型：string[1, 32]
     * 描述：
     *  微信支付交易订单号。
     *  示例值：1217752501201407033233368018
     * </pre>
     */
    private String transactionId;
    /**
     * <pre>
     * 字段名：商户订单号
     * 变量名：out_trade_no
     * 是否必填：是
     * 类型：string[1, 32]
     * 描述：
     *  原支付交易对应的商户订单号。
     *  示例值：1217752501201407033233368018
     * </pre>
     */
    private String outTradeNo;
    /**
     * <pre>
     * 字段名：退款渠道
     * 变量名：channel
     * 是否必填：是
     * 类型：string[1, 32]
     * 描述：
     *  枚举值：
     *  ORIGINAL：原路退款
     *  BALANCE：退回到余额
     *  OTHER_BALANCE：原账户异常退到其他余额账户
     *  OTHER_BANKCARD：原银行卡异常退到其他银行卡
     *  示例值：ORIGINAL
     * </pre>
     */
    private String channel;
    /**
     * <pre>
     * 字段名：退款入账账户
     * 变量名：user_received_account
     * 是否必填：是
     * 类型：string[1, 64]
     * 描述：
     *  取当前退款单的退款入账方，有以下几种情况：
     *  1）退回银行卡：{银行名称}{卡类型}{卡尾号}
     *  2）退回支付用户零钱：支付用户零钱
     *  3）退还商户：商户基本账户商户结算银行账户
     *  4）退回支付用户零钱通：支付用户零钱通。
     *  示例值：招商银行信用卡0403
     * </pre>
     */
    private String userReceivedAccount;
    /**
     * <pre>
     * 字段名：退款成功时间
     * 变量名：success_time
     * 是否必填：是
     * 类型：string[1, 64]
     * 描述：
     *  退款成功时间，当退款状态为退款成功时有返回。遵循rfc3339标准格式，格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE，YYYY-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日13点29分35秒。
     *  示例值：2020-12-01T16:18:12+08:00
     * </pre>
     */
    private String successTime;
    /**
     * <pre>
     * 字段名：退款创建时间
     * 变量名：create_time
     * 是否必填：是
     * 类型：string[1, 64]
     * 描述：
     *  退款受理时间。 遵循rfc3339标准格式，格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE，YYYY-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC 8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日13点29分35秒。
     *  示例值：2020-12-01T16:18:12+08:00
     * </pre>
     */
    private String createTime;
    /**
     * <pre>
     * 字段名：退款状态
     * 变量名：status
     * 是否必填：是
     * 类型：string[1, 32]
     * 描述：
     *  退款到银行发现用户的卡作废或者冻结了，导致原路退款银行卡失败，可前往商户平台-交易中心，手动处理此笔退款。
     *  枚举值：
     *  SUCCESS：退款成功
     *  CLOSED：退款关闭
     *  PROCESSING：退款处理中
     *  ABNORMAL：退款异常
     *  示例值：SUCCESS
     * </pre>
     */
    private String status;
    /**
     * <pre>
     * 字段名：资金账户
     * 变量名：funds_account
     * 是否必填：是
     * 类型：string[1, 32]
     * 描述：
     *  退款所使用资金对应的资金账户类型。 枚举值：
     *  UNSETTLED : 未结算资金
     *  AVAILABLE : 可用余额
     *  UNAVAILABLE : 不可用余额
     *  OPERATION : 运营户
     *  示例值：UNSETTLED
     * </pre>
     */
    private String fundsAccount;
    /**
     * <pre>
     * 字段名：金额信息
     * 变量名：amount
     * 是否必填：是
     * 类型：object
     * 描述：
     *  金额详细信息。
     * </pre>
     */
    private Amount amount;

    @Data
    @NoArgsConstructor
    public static class Amount implements Serializable {
        private static final long serialVersionUID = 1L;
        /**
         * <pre>
         * 字段名：订单金额
         * 变量名：total
         * 是否必填：是
         * 类型：int
         * 描述：
         *  订单总金额，单位为分。
         *  示例值：100
         * </pre>
         */
        private Integer total;
        /**
         * <pre>
         * 字段名：退款金额
         * 变量名：refund
         * 是否必填：是
         * 类型：int
         * 描述：
         *  退款标价金额，单位为分，可以做部分退款。
         *  示例值：100
         * </pre>
         */
        private Integer refund;
        /**
         * <pre>
         * 字段名：用户支付金额
         * 变量名：payer_total
         * 是否必填：是
         * 类型：int
         * 描述：
         *  现金支付金额，单位为分，只能为整数。
         *  示例值：90
         * </pre>
         */
        private Integer payerTotal;
        /**
         * <pre>
         * 字段名：用户退款金额
         * 变量名：payer_refund
         * 是否必填：是
         * 类型：int
         * 描述：
         *  退款给用户的金额，不包含所有优惠券金额。
         *  示例值：90
         * </pre>
         */
        private Integer payerRefund;
        /**
         * <pre>
         * 字段名：应结退款金额
         * 变量名：settlement_refund
         * 是否必填：是
         * 类型：int
         * 描述：
         *  去掉非充值代金券退款金额后的退款金额，单位为分，退款金额=申请退款金额-非充值代金券退款金额，退款金额<=申请退款金额。
         *  示例值：100
         * </pre>
         */
        private Integer settlementRefund;
        /**
         * <pre>
         * 字段名：用户退款金额
         * 变量名：settlement_total
         * 是否必填：是
         * 类型：int
         * 描述：
         *  应结订单金额=订单金额-免充值代金券金额，应结订单金额<=订单金额，单位为分。
         *  示例值：100
         * </pre>
         */
        private Integer settlementTotal;
        /**
         * <pre>
         * 字段名：优惠退款金额
         * 变量名：discount_refund
         * 是否必填：否
         * 类型：int64
         * 描述：
         *  优惠退款金额<=退款金额，退款金额-代金券或立减优惠退款金额为现金，说明详见代金券或立减优惠，单位为分。
         *  示例值：10
         * </pre>
         */
        private Integer discountRefund;
        /**
         * <pre>
         * 字段名：币类型
         * 变量名：currency
         * 是否必填：否
         * 类型：string[1, 16]
         * 描述：
         *  符合ISO 4217标准的三位字母代码，目前只支持人民币：CNY。
         *  示例值：CNY
         * </pre>
         */
        private String currency;
    }
}
